<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. 父构造函数 
        function Father(uname, age) {
            // this指向父构造函数实例对象
            this.uname = uname
            this.age = age
        }
        Father.prototype.money = function () {
            console.log(1000000);
        }
        // 2.子构造函数
        function Son(uname, age, screen) {
            // this 指向子构造函数的实例对象
            Father.call(this, uname, age)
            this.screen = screen
        }
        // Son.prototype = Father.prototype// 这样直接赋值会有问题 如果修改了子原型对象 父原型对象也会跟着一起变化
        Son.prototype = new Father()
        // 如果利用对象形式修改了原型对象 别忘了利用constructor 指回原来的构造函数
        Son.prototype.constructor = Son
        Son.prototype.exam = function () {
            console.log('exam');
        }
        var son = new Son('刘德华', 18)
        console.log(Son.prototype);
        son.money()


        // 通过我们的原型对象来继承我们的方法 我们共享的方法是写到我们这个原型对象里面的 在父原型对象里面有一个money方法 那我们子构造函数怎么去使用这个money方法呢？不能直接让我们的子原型对象=父原型对象,这样的话你修改子原型对象父原型对象也一起来变 所以我们做了这么一步操作,让父构造函数实例化一下创建了一个实例对象 让我们子原型对象指向这实例对象 因为实例对象有个对象__proto__原型 他会指向父构造函数的原型对象 所以说他是可以拿到money放法的 而我的子原型对象是指向这个实例化对象的 所以子构造函数也可以使用money这个方法了 而且我怎么修改子原型对象里面的方法都不会影响这个父原型对象里面 因为子原型对象指向的是父构造函数的实例对象 父原型对象和父实例对象地址是不一样的 所以不会有相互的影响 这一个就是利用我们原型对象来实现方法的继承

    </script>
</body>

</html>